// 条件运算 判断 extends  if else
type IsNumber<T> = T extends 2 ? true : false;

type res1 = IsNumber<1>; // false

type res2 = IsNumber<2>; // true

// 推导 infer
// 取元组类型的第一个元素

type First<Tuple extends unknown[]> = Tuple extends [infer T, ...infer Rest]
  ? T
  : never;

type res = First<[1, 2, 3]>;

// 注意，第一个 extends 不是条件，条件类型是 extends ?
// :，这里的 extends 是约束的意思，也就是约束类型参数只能是数组类型。

// 映射类型
type MapType<T> = {
  [Key in keyof T]: T[Key];
};

// keyof T 是查询索引类型中所有的索引，叫做索引查询。

// T[Key] 是取索引类型某个索引的值，叫做索引访问。

type res3 = MapType<{ a: 1; b: 2 }>;

type MapType1<T> = {
  [Key in keyof T]: [T[Key], T[Key], T[Key]];
};

type res4 = MapType1<{ a: 1 }>;

// 除了值可以变化，索引也可以做变化，用 as 运算符，叫做重映射

type MapType2<T> = {
  [Key in keyof T as `${Key & string}${Key & string}${Key & string}`]: [
    T[Key],
    T[Key],
    T[Key]
  ];
};

type res5 = MapType2<{ a: 2 }>;
